/****************************** (C) COPYRIGHT 2016 RSEStudio ****************************
* File Name          : 
* Author             : RSES_Liyang
* Version            : V1.0.0
* Date               : 00-May-18
* Description        : 
*****************************************************************************************/
/* Includes ----------------------------------------------------------------------------*/
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "Bsp.h"
#include "main.h"
#include "device_pins.h"
// #include "ws2812.h"
#include "button.h"
// #include "UI.h"
#include "W25X.h"
#include "PowerManager.h"
#include "oled.h"
// #include "VL53L0.h"

#include "MEAS.h"

/* Private define ----------------------------------------------------------------------*/
#define ADC_SAMPLE_NBR              30
#define ADC_SAMPLE_LOSE             10

#define KEY_HOLDE_TIME              80

#define PM_PERIOD_KEY_POLLING		16	//10ms
#define PM_PERIOD_LED_POLLING		80	//50ms
#define PM_PERIOD_BAT_POLLING		160	//100ms

#define PM_EVENT_KEY_POLLING		0x0004
#define PM_EVENT_LED_POLLING		0x0008
#define PM_EVENT_BAT_POLLING		0x0010



/* Private macro -----------------------------------------------------------------------*/

///////////////// led  //////////////////////////////////////////

/* Extern variables --------------------------------------------------------------------*/
rses_led_t led_sys;
rses_led_t led_run;
rses_led_t led_ble;
			
/* Private typedef ---------------------------------------------------------------------*/
/* Private variables -------------------------------------------------------------------*/

btn_t h_key_power;
btn_t h_key_up_play;
btn_t h_key_down;

uint16_t ble_connect_status_last;

// uint8_t pm_stack[1536];
// struct rt_thread pm_thread;
/* Private functions -------------------------------------------------------------------*/

// /*****************************************************************************************
// * Function Name  : Main_uDelay
// * Description    : 
// * Input          : None
// * Output         : None
// * Return         : None
// *****************************************************************************************/
// void Main_uDelay(uint16_t x)
// {
// 	uint16_t i;
// 	while(x--)
// 	{
// 		for(i=0;i<100;i++);
// 	}
// }
// //

// void i2c_uDelay(uint16_t x)
// {
// 	uint8_t i;
// 	while(x--)
// 	{
// 		for(i=0;i<20;i++);
// //		__asm("nop");
// //		__asm("nop");
// //		__asm("nop");
// //		__asm("nop");
// //		__asm("nop");
// //		__asm("nop");
// //		__asm("nop");
// //		__asm("nop");
// 	}
// }
// //

// void PM_IIC_Start(void)
// {    
// 	PM_SCL_L();
// 	i2c_uDelay(5);
// 	PM_SDA_OUT();
// 	PM_SDA_H();
// 	i2c_uDelay(5);
// 	PM_SCL_H();
// 	i2c_uDelay(5);
// 	PM_SDA_L();
// 	i2c_uDelay(5);
// 	PM_SCL_L();
//     i2c_uDelay(5);
//     PM_SDA_L();
// }	  


// void PM_IIC_Stop(void)
// {
// 	PM_SCL_L();
// 	i2c_uDelay(5);
// 	PM_SDA_L();
// 	PM_SDA_OUT();
//     //PM_SDA_L();
//  	i2c_uDelay(5);
// 	PM_SCL_H();
// 	i2c_uDelay(5);
// 	PM_SDA_H();
// 	i2c_uDelay(10);							   	
// }

// uint8_t PM_IIC_ReadAck(void)
// {
// 	uint8_t Ack;

// 	PM_SCL_L();
// 	i2c_uDelay(5);	

// 	PM_SDA_IN();
// 	//PM_SDA_H();
// 	i2c_uDelay(5);	
	
// 	PM_SCL_H();
// 	i2c_uDelay(5);	
// 	if(PM_SDA_STS()==0)
// 	{
// 		Ack = 1;
// 	}
// 	else
// 	{
// 		Ack = 0;
// 	}
// 	PM_SCL_L();
	
// 	PM_SDA_H();
// 	PM_SDA_OUT();
// 	//PM_SDA_H();
// 	i2c_uDelay(5);	
// 	return Ack;
		
// }

// uint8_t PM_IIC_Wait_Ack(void)
// {
// 	uint16_t ucErrTime=0;
	
// 	PM_SCL_L();
// 	i2c_uDelay(3);
// 	PM_SDA_IN();
//     //PM_SDA_H();
//     i2c_uDelay(1);	 
// 	PM_SCL_H();	 
// 	while(PM_SDA_STS())
// 	{
// 		i2c_uDelay(1);	 
// 		ucErrTime++;
// 		if(ucErrTime>10)
// 		{	
// 			PM_IIC_Stop();
// 			return 1;
// 		}
// 	}
// 	i2c_uDelay(1);
// 	PM_SCL_L();
// 	PM_SDA_H();
// 	PM_SDA_OUT();
//     //PM_SDA_H();
// 	return 0;  
// } 
// //??ACK??
// void PM_IIC_Ack(void)
// {
// 	PM_SCL_L();
// 	i2c_uDelay(2);
// 	PM_SDA_L();
// 	PM_SDA_OUT();
//     //PM_SDA_L();
// 	PM_SCL_H();
// 	i2c_uDelay(2);
// 	PM_SCL_L();
// }
// //???ACK??		    
// void PM_IIC_NAck(void)
// {
// 	PM_SCL_L();
// 	i2c_uDelay(2);
// 	PM_SDA_H();
// 	PM_SDA_OUT();
//     //PM_SDA_H();
// 	PM_SCL_H();
// 	i2c_uDelay(2);
// 	PM_SCL_L();
// }					 				     

	  
// void PM_IIC_Send_Byte(uint8_t txd)
// {                        
//     uint8_t t;       
//     PM_SCL_L();
// 	PM_SDA_OUT();

//     for(t=0;t<8;t++)
//     {              
// 		if(txd&0x80)
// 			PM_SDA_H();
// 		else
// 			PM_SDA_L();
// 		txd<<=1; 	  
// 		i2c_uDelay(2);   
// 		PM_SCL_H();
// 		i2c_uDelay(2); 
// 		PM_SCL_L();
//     }	 
// } 	    

   
// uint8_t PM_IIC_Read_Byte(uint8_t ack)
// {
// 	uint8_t i,receive=0;
// 	PM_SCL_L(); 
// 	PM_SDA_IN();
// 	//PM_SDA_H();
	
// 	i2c_uDelay(5);
//     for(i=0;i<8;i++ )
// 	{
//         PM_SCL_L(); 
//         i2c_uDelay(2);
// 		PM_SCL_H();
// 		i2c_uDelay(2);
//         receive<<=1;
//         if(PM_SDA_STS())
// 			receive++;   
//     }					 
//     if (!ack)
//         PM_IIC_NAck();//??nACK
//     else
//         PM_IIC_Ack(); //??ACK 
	
//     return receive;
// }
// //

// /*****************************************************************************************
// * Function Name  : ReadInput
// * Description    : 
// * Input          : None
// * Output         : None
// * Return         : None
// *****************************************************************************************/
// uint8_t IO_ReadInput(uint8_t addr)
// {
// 	//rt_base_t level;
// 	//level = rt_hw_interrupt_disable();
// 	uint8_t Data;
// 	PM_IIC_Start();
// 	PM_IIC_Send_Byte(addr);
// 	PM_IIC_Wait_Ack();
// 	PM_IIC_Send_Byte(0x00);
// 	PM_IIC_Wait_Ack();
	
// 	PM_IIC_Start();
// 	PM_IIC_Send_Byte(addr|0x01);
// 	PM_IIC_Wait_Ack();
// 	Data = PM_IIC_Read_Byte(0);
// 	PM_IIC_Stop();
// 	//rt_hw_interrupt_enable(level);
// 	return Data;
// }


// /*****************************************************************************************
// * Function Name  : led_lr_ctl
// * Description    : 
// * Input          : None
// * Output         : None
// * Return         : None
// *****************************************************************************************/
// rt_int32_t led_sys_ctl(uint16_t color)
// {
//     switch(color)
//     {
//         case LED_COLOR_BLACK:
//         {
//             LED_SYS_R_OFF();
//             LED_SYS_G_OFF();              
//         }break;
        
//         case LED_COLOR_RED:
//         {
//             LED_SYS_R_ON();
//             LED_SYS_G_OFF(); 
//         }break;
        
//         case LED_COLOR_GREEN:
//         {
//             LED_SYS_R_OFF();
//             LED_SYS_G_ON(); 
//         }break;
        
//         case LED_COLOR_BLUE:
//         {
//             LED_SYS_R_OFF();
//             LED_SYS_G_OFF(); 
//         }break;
        
//         default:
//         {
//             LED_SYS_R_OFF();
//             LED_SYS_G_OFF();  
//         }
//     } 
//     ws2812_send();    
// 	return 0;
// }
// //

// /*****************************************************************************************
// * Function Name  : led_lr_ctl
// * Description    : 
// * Input          : None
// * Output         : None
// * Return         : None
// *****************************************************************************************/
// rt_int32_t led_run_ctl(uint16_t color)
// {
//     switch(color)
//     {
//         case LED_COLOR_BLACK:
//         {
//             LED_RUN_R_OFF();
//             LED_RUN_G_OFF();        
//             LED_RUN_B_OFF(); 
            
//         }break;
        
//         case LED_COLOR_RED:
//         {
//             LED_RUN_R_ON();
//             LED_RUN_G_OFF();        
//             LED_RUN_B_OFF();  
//         }break;
        
//         case LED_COLOR_GREEN:
//         {
//             LED_RUN_R_OFF();
//             LED_RUN_G_ON();        
//             LED_RUN_B_OFF(); 
//         }break;
        
//         case LED_COLOR_BLUE:
//         {
//             LED_RUN_R_OFF();
//             LED_RUN_G_OFF();        
//             LED_RUN_B_ON(); 
//         }break;
        
//         default:
//         {
//             LED_RUN_R_OFF();
//             LED_RUN_G_OFF();        
//             LED_RUN_B_OFF();  
//         }
//     }
   
//     ws2812_send();
// 	return 0;
// }
// //

// /*****************************************************************************************
// * Function Name  : led_lr_ctl
// * Description    : 
// * Input          : None
// * Output         : None
// * Return         : None
// *****************************************************************************************/
// rt_int32_t led_ble_ctl(uint16_t color)
// {
//     switch(color)
//     {     
//         case LED_COLOR_BLACK:
//         {
//             LED_BLE_R_OFF();
//             LED_BLE_B_OFF();          
//         }break;
        
//         case LED_COLOR_BLUE:
//         {
//             LED_BLE_R_OFF();
//             LED_BLE_B_ON(); 
//         }break;
        
//         case LED_COLOR_RED:
//         {
//             LED_BLE_R_ON();
//             LED_BLE_B_OFF();      
//         }break;
        
//         default:
//         {
//             LED_BLE_R_OFF();
//             LED_BLE_B_OFF();  
//         }
//     }
//     ws2812_send();
// 	return 0;
// }
// //


// /*****************************************************************************************
// * Function Name  : Power_OFF
// * Description    : 
// * Input          : None
// * Output         : None
// * Return         : None
// *****************************************************************************************/
// void Power_OFF(void)
// {
// 	uint16_t power_off_timer;
    
// 	rt_thread_delay(50);
//     rt_enter_critical();
    
// #if DEV_TYPE == DEV_TYPE_I7
//     oled_off();
// #elif DEV_TYPE == DEV_TYPE_XP
    
//     LED_RUN_B_OFF();  
//     LED_RUN_G_OFF();
//     LED_RUN_R_OFF();
//     LED_SYS_R_OFF();
//     LED_SYS_G_OFF();	  
//     LED_BLE_B_OFF();
//     LED_BLE_R_OFF();
    
// #elif DEV_TYPE == DEV_TYPE_MINI
    
//     LED_RUN_B_OFF();  
//     LED_RUN_G_OFF();
//     LED_RUN_R_OFF();
//     LED_SYS_R_OFF();
//     LED_SYS_G_OFF();	  
//     LED_BLE_B_OFF();
//     LED_BLE_R_OFF();
    
// #elif DEV_TYPE == DEV_TYPE_VACUUM
    
//     LED_RUN_B_OFF();  
//     LED_RUN_G_OFF();
//     LED_RUN_R_OFF();
//     LED_SYS_R_OFF();
//     LED_SYS_G_OFF();	  
//     LED_BLE_B_OFF();
//     LED_BLE_R_OFF();
    
    
// #elif DEV_TYPE == DEV_TYPE_OXYGEN_STD
    
//     PUMP_OFF();
// 	HEAT_OFF();
    
//     LED_RUN_B_OFF();  
//     LED_RUN_G_OFF();
//     LED_RUN_R_OFF();
//     LED_SYS_R_OFF();
//     LED_SYS_G_OFF();	  
//     LED_BLE_B_OFF();
//     LED_BLE_R_OFF();
    
//     ws2812_send();
    
// #elif DEV_TYPE == DEV_TYPE_RPT_STD
//     oled_off();
// #else
// #error
// #endif
// 	power_off_timer = 0;
	
// 	WL_POWER_OFF();
//     BSP_uDelay(20000);
//     BSP_uDelay(20000);
//     BSP_uDelay(20000);
    
// 	SYS_POWER_OFF();
// //	while((KEY_POWER_STS()!=0)||(BUS_LINK_STS()!=0))
// //	{
// //        WDG_Refresh();
// //    }
    
//     while(1)
//     {
//         WDG_Refresh();
//         BSP_uDelay(2000);
//     }
// } 
// //

// /*****************************************************************************************
// * Function Name  : led_Polling
// * Description    : 
// * Input          : None
// * Output         : None
// * Return         : None
// *****************************************************************************************/
// int rses_led_create(rses_led_t *led_head,rt_int32_t (*led_opera)(uint16_t mode))
// {

// 	if(led_opera == RT_NULL)
// 	{
// 		return -1;
// 	}
	
// 	led_head->led_opera = led_opera;
	
// 	return 0;
// }
// //


// /*****************************************************************************************
// * Function Name  : rses_led_off
// * Description    : 
// * Input          : None
// * Output         : None
// * Return         : None
// *****************************************************************************************/
// void rses_led_control(rses_led_t *led,rt_int32_t status)
// {
// 	RT_ASSERT(led);
// 	led->led_opera(status);
// }
// //


// /*****************************************************************************************
// * Function Name  : bq_read_2byte
// * Description    : 
// * Input          : None
// * Output         : None
// * Return         : None
// *****************************************************************************************/
// int bq_write_byte(uint8_t addr,uint16_t data,uint8_t cnt,uint8_t mode)
// {
// 	int result;
	
// 	PM_IIC_Start();	
	
// 	PM_IIC_Send_Byte(0xAA);
// //	if(mode == 0)
// //	{
// //		i2c_uDelay(80); 
// //	}
// 	result = PM_IIC_Wait_Ack();
// 	if(result != 0)
// 	{
// 		goto end;
// 	}
	
// 	PM_IIC_Send_Byte(addr);
// 	if(mode == 0)
// 	{
// 		i2c_uDelay(50); 
// 	}	
// 	result = PM_IIC_Wait_Ack();
// 	if(result != 0)
// 	{
// 		goto end;
// 	}
	
// 	PM_IIC_Send_Byte((data>>0)&0xFF);
// 	if(mode == 0)
// 	{
// 		i2c_uDelay(50); 
// 	}	
// 	result = PM_IIC_Wait_Ack();
// 	if(result != 0)
// 	{
// 		goto end;
// 	}	
	
// 	if(cnt !=0 )
// 	{
// 		PM_IIC_Send_Byte((data>>8)&0xFF);
// 		if(mode == 0)
// 		{
// 			i2c_uDelay(50); 
// 		}	
// 		result = PM_IIC_Wait_Ack();
// 		if(result != 0)
// 		{
// 			goto end;
// 		}
// 	}
		
// 	PM_IIC_Stop();
	
// 	end:
// 	return result;
// }
// //

// /*****************************************************************************************
// * Function Name  : bq_read_2byte
// * Description    : 
// * Input          : None
// * Output         : None
// * Return         : None
// *****************************************************************************************/
// int bq_read_byte(uint8_t addr,uint16_t *data,uint8_t cnt,uint8_t mode)
// {
// 	int result;
// 	uint16_t temp_16;
	
// 	PM_IIC_Start();
// 	PM_IIC_Send_Byte(0xAA);
// //	if(mode == 0)
// //	{
// //		i2c_uDelay(30); 
// //	}
// 	result = PM_IIC_Wait_Ack();
// 	if(result != 0)
// 	{
// 		goto end;
// 	}
	
// 	PM_IIC_Send_Byte(addr);
// 	if(mode == 0)
// 	{
// 		i2c_uDelay(50); 
// 	}
// 	result = PM_IIC_Wait_Ack();
// 	if(result != 0)
// 	{
// 		goto end;
// 	}

// 	PM_IIC_Start();
// 	PM_IIC_Send_Byte(0xAB);
// 	if(mode == 0)
// 	{
// 		i2c_uDelay(50); 
// 	}
// 	result = PM_IIC_Wait_Ack();
// 	if(result != 0)
// 	{
// 		goto end;
// 	}
	
// 	if(mode == 0)
// 	{
// 		i2c_uDelay(100); 
// 	}
// 	if(cnt == 0)
// 	{
// 		temp_16 = PM_IIC_Read_Byte(0)<<0; 
// 	}
// 	else
// 	{
// 		temp_16 = PM_IIC_Read_Byte(1)<<0; 
// 		if(mode == 0)
// 		{
// 			i2c_uDelay(50); 
// 		}
// 		temp_16 |= PM_IIC_Read_Byte(0)<<8;
// 	}
// 	if(mode == 0)
// 	{
// 		i2c_uDelay(50); 
// 	}
	
// 	PM_IIC_Stop();

// 	end:
// 	*data = temp_16;
// 	return result;
// }
// //


// #define BQ_SUB_CONTROL_STATUS		0x0000
// #define BQ_SUB_DEVICE_TYPE			0x0001
// #define BQ_SUB_FW_VERSION			0x0002
// #define BQ_SUB_DM_CODE				0x0004
// #define BQ_SUB_PREV_MAC				0x0007
// #define BQ_SUB_CHEM_ID				0x0008
// #define BQ_SUB_BAT_INSERT			0x000C
// #define BQ_SUB_BAT_REMOVE			0x000D
// #define BQ_SUB_SET_HIBERNATE		0x0011
// #define BQ_SUB_CLEAR_HIBERNATE		0x0012
// #define BQ_SUB_SET_CFGUPDATE		0x0013
// #define BQ_SUB_SHUTDOWN_ENABLE		0x001B
// #define BQ_SUB_SHUTDOWN				0x001C
// #define BQ_SUB_SEALED				0x0020
// #define BQ_SUB_TOGGLE_GPOUT			0x0023
// #define BQ_SUB_RESET				0x0041
// #define BQ_SUB_SOFT_RESET			0x0042
// #define BQ_SUB_EXIT_CFGUPDATE		0x0043
// #define BQ_SUB_EXIT_RESIM			0x0044

// int bq_control_slow(uint16_t ctl,uint16_t *pdata)
// {
// 	int16_t tesult;
// 	uint16_t temp16;
	
// 	bq_write_byte(0x00,ctl,1,0);
// 	tesult = bq_read_byte(0x00,&temp16,1,0);
// 	*pdata = temp16;
// 	return tesult;
// }

// int bq_control_fast(uint16_t ctl,uint16_t *pdata)
// {
// 	int16_t tesult;
// 	uint16_t temp16;
	
// 	bq_write_byte(0x00,ctl,1,1);
// 	tesult = bq_read_byte(0x00,&temp16,1,1);
// 	*pdata = temp16;
// 	return tesult;
// }

// int bq_blockdata_opera_16(uint16_t block,uint8_t addr,uint16_t *pdata_r,uint16_t data_w,uint8_t mode,uint8_t cnt)
// {
// 	uint16_t temp_16;
// 	uint16_t temp_16_a;
	
// 	uint8_t check_sum;
// 	int16_t result;
	
// 	result = 0;
// 	//Config safety
// 	result = bq_write_byte(0x61,0x00,0,0);	//ENABLE access 
// 	result = bq_write_byte(0x3E,block,0,0);	//Select 2
// 	result = bq_write_byte(0x3F,0x00,0,0);//Select
	
// 	result = bq_read_byte(0x60,&temp_16,0,0); //Check_sum
// 	if(result != 0)
// 	{
// 		goto err;
// 	}	
// 	check_sum = 0xFF -  temp_16;//tmp_chksum
	
	
// 	result = bq_read_byte(0x40 + addr,&temp_16,0,0); 
// 	if(result != 0)
// 	{
// 		goto err;
// 	}
// 	check_sum = check_sum - temp_16&0xFF;
// 	temp_16_a = temp_16;
	
// 	if(cnt != 0)
// 	{
// 		temp_16_a = (temp_16<<8)&0xFF00;
// 		result = bq_read_byte(0x40 + addr + 1,&temp_16,0,0); 
// 		if(result != 0)
// 		{
// 			goto err;
// 		}
// 		check_sum = check_sum - temp_16&0xFF;
// 		temp_16_a |= (temp_16<<0)&0x00FF;
// 	}
// 	*pdata_r = temp_16_a;
		
// 	if(mode != 0)
// 	{
// 		if(cnt == 0)
// 		{
// 			temp_16 = data_w&0xFF;
// 			check_sum = check_sum + temp_16&0xFF;
// 			result = bq_write_byte(0x40 + addr,temp_16,0,0); //
// 			if(result != 0)
// 			{
// 				goto err;
// 			}	
// 		}
// 		else
// 		{
// 			temp_16 = (data_w>>8)&0xFF;
// 			check_sum = check_sum + temp_16&0xFF;
// 			result = bq_write_byte(0x40 + addr,temp_16,0,0); //
// 			if(result != 0)
// 			{
// 				goto err;
// 			}
			
// 			temp_16 = (data_w>>0)&0xFF;
// 			check_sum = check_sum + temp_16&0xFF;
// 			result = bq_write_byte(0x40 + addr + 1,temp_16,0,0); //
// 			if(result != 0)
// 			{
// 				goto err;
// 			}		
// 		}
		
// 		check_sum = 0xFF - check_sum;
	
// 		result = bq_write_byte(0x60,check_sum,0,0);
// 		if(result != 0)
// 		{
// 			goto err;
// 		}

// 		rt_thread_delay(3);
		
// 		result = bq_write_byte(0x3E,block,0,0);	//Select 64 state data 
// 		if(result != 0)
// 		{
// 			goto err;
// 		}	
// 		result = bq_write_byte(0x3F,0x00,0,0);	//Select 82 state data 	
// 		if(result != 0)
// 		{
// 			goto err;
// 		}	
// 		result = bq_read_byte(0x60,&temp_16,0,0);
// 		if(result != 0)
// 		{
// 			goto err;
// 		}
		
// 		if((temp_16&0xFF) != check_sum)
// 		{
// 			result = 2;
// 			goto err;
// 		}		
// 	}
	
// 	err:
// 	return result;
// }

// /*****************************************************************************************
// * Function Name  : PowerManager_Init
// * Description    : 
// * Input          : None
// * Output         : None
// * Return         : None
// *****************************************************************************************/
// uint16_t PowerManager_Init(void)
// {
//     uint16_t error_id;
// 	uint16_t temp_16;
// 	uint16_t temp_16_a;
// 	int16_t result;
// 	uint16_t i;

//     error_id = 0;
    
//     rt_thread_delay(10);
	
// 	//unseal
// 	result = bq_write_byte(0x00,0x8000,1,0);
// 	if(result != 0)
// 	{
//         error_id = 1;
// 		goto err;
// 	}
// 	result = bq_write_byte(0x00,0x8000,1,0);
// 	if(result != 0)
// 	{
//         error_id = 2;
// 		goto err;
// 	}
	
// 	rt_thread_delay(10);
	
// 	//Get design cap
// 	result = bq_blockdata_opera_16(82,10,&temp_16,temp_16_a,0,1);
// 	if(result != 0)
// 	{
//         error_id = 3;
// 		goto err;
// 	}
	
// 	//Get flag : ITPOR
// 	result = bq_read_byte(0x06,&i,1,0);
// 	if(result != 0)
// 	{
//         error_id = 4;
// 		goto err;
// 	}
	
// 	if((temp_16 != iProfile.conf.Bat_capacity)||((i&(1<<5)) != 0))
// 	{	
// 		bq_control_slow(BQ_SUB_SET_CFGUPDATE,&temp_16);	//config update mode
		
//         log_write(EFLOG_LVL_ALARM,LOG_TAG_HARD,LOG_HARD_PM_REINIT,0,0,0,0);    
        
// 		rt_thread_delay(30);

// 		//Get flag : CFGUPMODE
// 		result = bq_read_byte(0x06,&temp_16,1,0);
// 		if(result != 0)
// 		{
//             error_id = 5;
// 			goto err;
// 		}
// 		//flag : CFGUPMODE == 1
// 		if((temp_16 & (1<<4))==0)
// 		{
//             error_id = 6;
// 			goto err;
// 		}
		
// 		rt_thread_delay(10);
		
// 		temp_16_a = 1020;
// 		result = bq_blockdata_opera_16(2,0,&temp_16,temp_16_a,1,1);
// 		if(result != 0)
// 		{
//             error_id = 7;
// 			goto err;
// 		}
		
// 		temp_16_a = 48;
// 		result = bq_blockdata_opera_16(2,4,&temp_16,temp_16_a,1,0);
// 		if(result != 0)
// 		{
//             error_id = 8;
// 			goto err;
// 		}
	
// 		result = bq_blockdata_opera_16(64,0,&temp_16,temp_16_a,0,1);
// 		temp_16_a = temp_16 | (1<<5);       
// 		result = bq_blockdata_opera_16(64,0,&temp_16,temp_16_a,1,1);
// 		if(result != 0)
// 		{
//             error_id = 9;
// 			goto err;
// 		}
        
		
// 		temp_16_a = 3;
// 		result = bq_blockdata_opera_16(68,7,&temp_16,temp_16_a,1,1);
// 		if(result != 0)
// 		{
//             error_id = 10;
// 			goto err;
// 		}
		
// 		temp_16_a = 3000;
// 		result = bq_blockdata_opera_16(68,9,&temp_16,temp_16_a,1,1);
// 		if(result != 0)
// 		{
//             error_id = 11;
// 			goto err;
// 		}
		
// 		//Design Capacity
// 		temp_16_a = iProfile.conf.Bat_capacity;
// 		result = bq_blockdata_opera_16(82,10,&temp_16,temp_16_a,1,1);
// 		if(result != 0)
// 		{
//             error_id = 12;
// 			goto err;
// 		}
		
// 		//Design Energy
// 		temp_16_a = iProfile.conf.Bat_capacity * 3.7;
// 		result = bq_blockdata_opera_16(82,12,&temp_16,temp_16_a,1,1);
// 		if(result != 0)
// 		{
//             error_id = 13;
// 			goto err;
// 		}
		
// 		//Terminate Voltage 
// 		temp_16_a = 3200;
// 		result = bq_blockdata_opera_16(82,16,&temp_16,temp_16_a,1,1);
// 		if(result != 0)
// 		{
//             error_id = 14;
// 			goto err;
// 		}
		
// 		//
// 		temp_16_a = 40;
// 		result = bq_blockdata_opera_16(82,22,&temp_16,temp_16_a,1,1);
// 		if(result != 0)
// 		{
//             error_id = 15;
// 			goto err;
// 		}
		
// 		//	
// 		result = bq_control_slow(BQ_SUB_SOFT_RESET,&temp_16);
// 		if(result != 0)
// 		{
//             error_id = 16;
// 			goto err;
// 		}
		
// 		rt_thread_delay(30);
	
// 		//Get flag : ITPOR
// 		result = bq_read_byte(0x06,&temp_16,1,0);
// 		if(result != 0)
// 		{
//             error_id = 17;
// 			goto err;
// 		}
		
// 		//flag : ITPOR == 1
// 		if((temp_16 & (1<<5))!=0)
// 		{
//             error_id = 18;
// 			goto err;
// 		}		
// 	}
    

	
//     return error_id;
    
// err:
//     iProfile.sys_status.Error_id |= ERROR_FLAG_BAT_MANAGER;
//     log_write(EFLOG_LVL_INFO,LOG_TAG_HARD,LOG_HARD_PM_INIT_FAULT,0,0,0,0); 
//     return error_id;
    
// }
// //

// uint8_t get_key_down(void)
// {
// 	if(KEY_DOWN_STS()!=0)
// 		return 1;
// 	else
// 		return 0;
// }

// uint8_t get_key_up_play(void)
// {
// 	if(KEY_UP_PLAY_STS()!=0)
// 		return 1;
// 	else
// 		return 0;
// }

// uint8_t get_key_power(void)
// {
//     if(KEY_POWER_STS()!=0)	
// 		return 1;
// 	else
// 		return 0;
// }

// void cb_key_power(btn_t *btn,uint8_t event)
// {
// 	HMI_ENGINE_RESULT Result;
// 	KEY_PRESS_EVENT		HMI_KeyEvent;

// 	HMI_KeyEvent.Head.iType = EVENT_TYPE_ACTION;
// 	HMI_KeyEvent.Head.iID = EVENT_ID_KEY_PRESS;

// 	HMI_KeyEvent.Data.uiKeyValue = 0x0100|event;
	
// 	Result = HMI_ProcessEvent((HMI_EVENT_BASE*)(&HMI_KeyEvent));
// 	if(Result == HMI_RET_CANCEL_KEY)
// 	{
// 		btn_control(btn,BUTTON_CTL_CANCEL_EVENT,0);
// 	}
// }
// //


// void cb_key_up_play(btn_t *btn,uint8_t event)
// {
// 	HMI_ENGINE_RESULT Result;
// 	KEY_PRESS_EVENT		HMI_KeyEvent;

// 	HMI_KeyEvent.Head.iType = EVENT_TYPE_ACTION;
// 	HMI_KeyEvent.Head.iID = EVENT_ID_KEY_PRESS;

// 	HMI_KeyEvent.Data.uiKeyValue = 0x0200|event;
// 	Result = HMI_ProcessEvent((HMI_EVENT_BASE*)(&HMI_KeyEvent));
// 	if(Result == HMI_RET_CANCEL_KEY)
// 	{
// 		btn_control(btn,BUTTON_CTL_CANCEL_EVENT,0);
// 	}
// }
// //


// void cb_key_down(btn_t *btn,uint8_t event)
// {
// 	HMI_ENGINE_RESULT Result;
// 	KEY_PRESS_EVENT		HMI_KeyEvent;

// 	HMI_KeyEvent.Head.iType = EVENT_TYPE_ACTION;
// 	HMI_KeyEvent.Head.iID = EVENT_ID_KEY_PRESS;

// 	HMI_KeyEvent.Data.uiKeyValue = 0x0300|event;
	
// 	Result = HMI_ProcessEvent((HMI_EVENT_BASE*)(&HMI_KeyEvent));
// 	if(Result == HMI_RET_CANCEL_KEY)
// 	{
// 		btn_control(btn,BUTTON_CTL_CANCEL_EVENT,0);
// 	}
// }
// //




// uint16_t bq_flag;
// uint16_t bq_status;
// uint32_t thread_max_used[16];
// /*****************************************************************************************
// * Function Name  : Task_PowerManager
// * Description    : 
// * Input          : None
// * Output         : None
// * Return         : None
// *****************************************************************************************/
// static void Task_PowerManager(void *params)
// {
// 	uint16_t timer_300ms;
// 	uint8_t  timer_300ms_sts;
	
// 	uint16_t timer_800ms;
// 	uint8_t  timer_800ms_sts;
	
// 	uint16_t ui_timer;
// 	uint16_t pm_timer;
// 	uint16_t bq_timer;
// 	uint16_t temp_16;
// 	int16_t result;
// 	uint16_t i;
//     static uint8_t charge_low_timer;
    
//     PowerManager_Init();  
	
// 	ui_timer = 0;
// 	bq_timer = 1000;
//     charge_low_timer = 0;
	
// 	ble_connect_status_last = 0xFF; 
	
// #if USE_V_SPEED == 1 	
//     VL53L0_init();
// #endif
	
// 	iProfile.sys_status.BatLevelStatus = 66;
	
// 	while(1)
// 	{     
        
// //        if(test_atant_flag!=0)
// //        {
// //            test_atant_flag = 0;
// //            a_a = atan2s32(a_y,a_x);
// //        }
        
        
        
// 		if(timer_300ms++>30)
// 		{
// 			timer_300ms = 0;
// 			if(timer_300ms_sts == 0)
// 			{
// 				timer_300ms_sts = 1;
// 			}
// 			else
// 			{
// 				timer_300ms_sts = 0;
// 			}
// 		}
		
// 		if(timer_800ms++>80)
// 		{
// 			timer_800ms = 0;
			
// 			if(timer_800ms_sts == 0)
// 			{
// 				timer_800ms_sts = 1;
// 			}
// 			else
// 			{
// 				timer_800ms_sts = 0;
// 			}
// 		}
		
// 		if(ui_timer++ > 40)
// 		{
// 			ui_timer = 0;
			
// 			for(i=0;i<11;i++)
// 			{
// 				thread_max_used[i] = test_sys_buf[i]->user_data;		
// 			}
            
//             if(iProfile.sys_status.BatVoltage < 3200 )
//             {
//                 charge_low_timer++;
//             }
//             else
//             {
//                 charge_low_timer = 0;
//             }

//             if(charge_low_timer > 50)
//             {                     

//             }
          
// #if DEV_TYPE == DEV_TYPE_I7
            
        
// #elif DEV_TYPE == DEV_TYPE_XP
// //            if((iProfile.sys_status.VbusOnline != 0)&&(iProfile.sys_status.BatChargeStatus == 1))
// //            {
// //                LED_SYS_R_ON();
// //                LED_SYS_G_OFF();
// //            }
// //            else
// //            {
// //                LED_SYS_G_ON();
// //                LED_SYS_R_OFF();
// //            }
// #elif DEV_TYPE == DEV_TYPE_MINI
       
// #elif DEV_TYPE == DEV_TYPE_VACUUM	
	
		
// #elif DEV_TYPE == DEV_TYPE_OXYGEN_STD	
//             if((iProfile.sys_status.VbusOnline != 0)&&(iProfile.sys_status.BatChargeStatus == 1))
//             {
//                 LED_SYS_R_ON();
//                 LED_SYS_G_OFF();
//             }
//             else
//             {
//                 LED_SYS_G_ON();
//                 LED_SYS_R_OFF();
//             }
            
//             ws2812_send();
// #elif DEV_TYPE == DEV_TYPE_RPT_STD

        
// #else       
// #error
// #endif	
//         }
		
// 		if(pm_timer++>4)
// 		{			
// 			pm_timer = 0;		
			
// 			if(BUS_LINK_STS()!=0)
// 			{
// 				iProfile.sys_status.VbusOnline = 1;
				
// 				if(iProfile.sys_status.BatLevelStatus < 98)
// 				{
// 					iProfile.sys_status.BatChargeStatus = 1;
// 				}
// 				else
// 				{
// 					iProfile.sys_status.BatChargeStatus = 2;
// 				}
// 			}
// 			else
// 			{
// 				iProfile.sys_status.VbusOnline = 0;
// 				iProfile.sys_status.BatChargeStatus = 0;
// 			}			
// 		}
        
//         if((iProfile.sys_status.Error_id & ERROR_FLAG_BAT_MANAGER)!=0)
//         {
//             bq_timer = 0;
//             iProfile.sys_status.BatVoltage = 2888;
//             iProfile.sys_status.BatLevelStatus = 11;
//         }
		
// 		if(bq_timer++>50)
// 		{
// 			bq_timer = 0;
// 			result = bq_read_byte(0x04,&temp_16,1,0); 
// 			if(result != 0)
// 			{
// 				//while(1);
// 			}	
// 			iProfile.sys_status.BatVoltage = temp_16;
			
// 			result = bq_read_byte(0x1C,&temp_16,1,0); 
// 			if(result != 0)
// 			{
// 				//while(1);
// 			}	
// 			iProfile.sys_status.BatLevelStatus = temp_16;
			
// 			result = bq_read_byte(0x00,&bq_status,1,0); 
// 			if(result != 0)
// 			{
// 				//while(1);
//                 meas_debug[10] = 0xAAAA;
// 			}
//             else
//             {
//                 meas_debug[10] = bq_status;
//             }
            
// //			
// 			result = bq_read_byte(0x06,&bq_flag,1,0); 
// 			if(result != 0)
// 			{
// 				//while(1);
//                 meas_debug[11] = 0xAAAA;
// 			}
//             else            
//             {
//                 meas_debug[11] = bq_flag;
//             }
// 		}
		
				
// 		if(ble_connect_status_last != iProfile.Ble.Status) 
// 		{
// 			ble_connect_status_last = iProfile.Ble.Status;
// 		}
              
// 		btn_process();
        
//         WDG_Refresh();
		
// #if USE_V_SPEED == 1       
// //        VL53L0X_polling();
// #endif
// 		rt_thread_delay(10);
// 	}
// }
// //


void ADS_nop(void)
{
    uint16_t i;
    for(i=0;i<3;i++)
    {
        ;
    }
}

void ADS_nop_2(void)
{
    uint16_t i;
    for(i=0;i<3;i++)
    {
        ;
    }
}

uint8_t ADS_SendByte(uint8_t Data)
{
    uint8_t i,j;
    uint8_t Temp;
	uint8_t recv_data;
    Temp = Data;
	recv_data = 0;
	
	ADS_SCLK_L();
	ADS_nop();
    for(i=0;i<8;i++)
    {   	
        if(Temp&0x80)
        {
            ADS_MOSI_H();
        }
        else
        {
            ADS_MOSI_L();
        }
		
        Temp<<=1;
        
        ADS_SCLK_H();      
        ADS_nop_2();
        
        recv_data<<=1;
        if(ADS_MISO() != 0)
        {
            recv_data |= 0x01;
        }
        
       	ADS_SCLK_L();        
        ADS_nop();        
               
    }	
	return recv_data;
}


//void ADS_WriteReg_NCS(uint8_t Addr,uint8_t Reg)
//{
//	ADS_SendByte(0x40 | Addr);
//    ADS_SendByte(Reg);
//}

void ADS_WriteReg(uint8_t Addr,uint8_t Reg)
{
    ADS_SendByte(0x40 | Addr<<2);
    ADS_SendByte(Reg);
}

void ADS_ReadReg(uint8_t Addr,uint8_t *Reg)
{
    ADS_SendByte(0x20 | Addr<<2);
    *Reg = ADS_SendByte(0x00);
}





// /*****************************************************************************************
// * Function Name  : 
// * Description    : 
// * Input          : None
// * Output         : None
// * Return         : None
// *****************************************************************************************/
// int PowerManager_Start(void)
// {
// 	rt_err_t result;
	
// //	if(SYS_PM_INIT_FLAG != 0xCCAA55AA)
// //	{
// //		//*iProfile.Status.PM_Counter = PM_BAT_CAP_MAX/2;
// //	}
    
//     rses_led_create(&led_run,led_run_ctl);
// 	rses_led_create(&led_sys,led_sys_ctl);
// 	rses_led_create(&led_ble,led_ble_ctl);

// 	btn_init(&h_key_power,get_key_power,cb_key_power);
// 	btn_init(&h_key_up_play,get_key_up_play,cb_key_up_play);
// 	btn_init(&h_key_down,get_key_down,cb_key_down);
    
// #if DEV_TYPE == DEV_TYPE_I7
// 	OLED_Init();
// #elif (DEV_TYPE == DEV_TYPE_XP) 
// #elif (DEV_TYPE == DEV_TYPE_MINI)
// #elif (DEV_TYPE == DEV_TYPE_VACUUM)   
// #elif (DEV_TYPE == DEV_TYPE_OXYGEN_STD)
	
// 	PUMP_OFF();
// 	HEAT_OFF();
    
//     LED_SYS_R_OFF();
//     LED_SYS_G_OFF();	
//     LED_RUN_B_OFF();  
//     LED_RUN_G_OFF();
//     LED_RUN_R_OFF();
//     LED_BLE_R_OFF();
//     LED_BLE_B_OFF();
    
// #elif (DEV_TYPE == DEV_TYPE_RPT_STD) 
//     OLED_Init();  
// #else
// #error
// #endif
		
// 	result = rt_thread_init(&pm_thread,"pm",Task_PowerManager,RT_NULL,pm_stack,sizeof(pm_stack),TD_PRI_NORMAL,5);
	
// 	if(result != RT_EOK)
// 	{
// 		while(1);
// 	}
	
// 	test_sys_buf[5] = &pm_thread;
	
// 	rt_thread_startup(&pm_thread);
	
// 	return result;
// }

// /********************************(C)COPYRIGHT 2016 RSEStudio ****************************/
// /*****************************************END OF FILE************************************/

